package br.ucb.rest.negocio.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;

import br.ucb.rest.negocio.AbstractBusinessObject;
import br.ucb.rest.persistencia.dao.GenericDAO;
import br.ucb.rest.persistencia.vo.ContaVO;
import br.ucb.rest.util.TradutorXML;

public class ContaBOS extends AbstractBusinessObject {
	private static ContaBOS instance;
	private Logger logger = Logger.getLogger(ContaBOS.class);
	private ContaBOS() {
		super();
		logger.info("Singleton insanciado com sucesso!");
	}
	public static ContaBOS getInstance() {
		if (instance == null) {
			instance = new ContaBOS();
		}
		return instance;
	}
	
	public String recuperarContaEmAberto(String idIpad) {
		EntityManager em = emf.createEntityManager();
		GenericDAO dao = GenericDAO.getInstance(em);
		try {
			Map<String, Object> parametros = new HashMap<String, Object>(1);
			parametros.put("idIpad", idIpad);
			
			ContaVO conta = null;
			try {
				conta =  (ContaVO) dao.namedQueryResultadoUnico("ContaVO.recuperarEmAberto", parametros);
			}catch (HibernateException e) {
				if (e.getCause().getClass() == NoResultException.class) {
					conta = new ContaVO();
				}
			}
			
			return TradutorXML.getInstance().traduzirConta(conta);
			
		}catch (Exception e) {
			logger.error("Erro ao recuperar os dados!",e);
			return null;
		}finally {
			GenericDAO.liberarInstancia();
			em.close();
		}		
		
	}
	
	public void fecharConta(String idIpad) {
		EntityManager em = emf.createEntityManager();
		GenericDAO dao = GenericDAO.getInstance(em);
		EntityTransaction transaction = null;
		try {
			transaction = em.getTransaction();
			transaction.begin();
			
			Map<String, Object> parametros = new HashMap<String, Object>(1);
			parametros.put("idIpad", idIpad);
			ContaVO conta =  (ContaVO) dao.namedQueryResultadoUnico("ContaVO.recuperarEmAberto", parametros);
			conta.setDtFechamento(new Date(System.currentTimeMillis()));
			dao.doUpdate(conta);
			
			transaction.commit();
		}catch (Exception e) {
			logger.error("Erro ao registrar fechamento da conta!",e);
			transaction.rollback();
			return;
		}finally {
			GenericDAO.liberarInstancia();
			em.close();
		}	
		
	}
	
	

}
